]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
[baseIcon] Tie the icon's width to its height
authorFlorian Müllner <fmuellner@gnome.org>
Mon, 30 Aug 2010 12:59:36 +0000 (14:59 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Thu, 23 Sep 2010 17:08:43 +0000 (19:08 +0200)
Both current design and new mockups use square icons. Currently this
is implemented by setting a fixed width and height in the CSS, which
does not work for the growing/shrinking items in the new sidebar.
By moving the assumption of square items into the code, the size will
adjust according to icon size, spacing, padding and font size if not
explicitly overwritten in the CSS.

https://bugzilla.gnome.org/show_bug.cgi?id=625887

js/ui/iconGrid.js

index b2b01930d79cdc7dcf84412db66792b971daca96..05abe1bdb094bda97bce53f6af6fdf9737a55bcd 100644 (file)
@@ -22,17 +22,23 @@ BaseIcon.prototype = {
                                   x_fill: true,
                                   y_fill: true });
         this.actor._delegate = this;
-
         this.actor.connect('style-changed',
                            Lang.bind(this, this._onStyleChanged));
 
-        let box = new St.BoxLayout({ vertical: true });
+        this._spacing = 0;
+
+        let box = new Shell.GenericContainer();
+        box.connect('allocate', Lang.bind(this, this._allocate));
+        box.connect('get-preferred-width',
+                    Lang.bind(this, this._getPreferredWidth));
+        box.connect('get-preferred-height',
+                    Lang.bind(this, this._getPreferredHeight));
         this.actor.set_child(box);
 
         this.iconSize = ICON_SIZE;
         this._iconBin = new St.Bin();
 
-        box.add(this._iconBin, { expand: true, x_fill: false, y_fill: false });
+        box.add_actor(this._iconBin);
 
         this._name = new St.Label({ text: label });
         box.add_actor(this._name);
@@ -45,6 +51,44 @@ BaseIcon.prototype = {
         this._iconBin.set_child(this.icon);
     },
 
+    _allocate: function(actor, box, flags) {
+        let availWidth = box.x2 - box.x1;
+        let availHeight = box.y2 - box.y1;
+
+        let [labelMinHeight, labelNatHeight] = this._name.get_preferred_height(-1);
+        let [iconMinHeight, iconNatHeight] = this._iconBin.get_preferred_height(-1);
+        let preferredHeight = labelNatHeight + this._spacing + iconNatHeight;
+        let labelHeight = availHeight >= preferredHeight ? labelNatHeight
+                                                         : labelMinHeight;
+        let iconSize = availHeight - this._spacing - labelHeight;
+        let iconPadding = (availWidth - iconSize) / 2;
+
+        let childBox = new Clutter.ActorBox();
+
+        childBox.x1 = iconPadding;
+        childBox.y1 = 0;
+        childBox.x2 = availWidth - iconPadding;
+        childBox.y2 = iconSize;
+        this._iconBin.allocate(childBox, flags);
+
+        childBox.x1 = 0;
+        childBox.x2 = availWidth;
+        childBox.y1 = iconSize + this._spacing;
+        childBox.y2 = childBox.y1 + labelHeight;
+        this._name.allocate(childBox, flags);
+    },
+
+    _getPreferredWidth: function(actor, forHeight, alloc) {
+        this._getPreferredHeight(actor, -1, alloc);
+    },
+
+    _getPreferredHeight: function(actor, forWidth, alloc) {
+        let [iconMinHeight, iconNatHeight] = this._iconBin.get_preferred_height(forWidth);
+        let [labelMinHeight, labelNatHeight] = this._name.get_preferred_height(forWidth);
+        alloc.min_size = iconMinHeight + this._spacing + labelMinHeight;
+        alloc.natural_size = iconNatHeight + this._spacing + labelNatHeight;
+    },
+
     // This can be overridden by a subclass, or by the createIcon
     // parameter to _init()
     createIcon: function(size) {
@@ -69,12 +113,19 @@ BaseIcon.prototype = {
     },
 
     _onStyleChanged: function() {
-        if (!this._setSizeManually) {
-            let node = this.actor.get_theme_node();
-            let [success, len] = node.get_length('icon-size', false);
-            if (success)
-                this._setIconSize(len);
-        }
+        let success, len;
+        let node = this.actor.get_theme_node();
+
+        [success, len] = node.get_length('spacing', false);
+        if (success)
+            this._spacing = spacing;
+
+        if (this._setSizeManually)
+            return;
+
+        [success, len] = node.get_length('icon-size', false);
+        if (success)
+            this._setIconSize(len);
     }
 };